package com.webserver.http;

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;


public class HttpServletResponse {
    private Socket socket;

    private int statusCode =200;
    private String statusReason="OK";

    private Map<String,String> headers=new HashMap<>();

    private File contentFile;

    public HttpServletResponse(Socket socket){
        this.socket=socket;
    }


    public void response() throws IOException {
        sendStatusLine();
        sendHeaders();
        sendContent();
    }
    private void sendStatusLine() throws IOException {
        println("HTTP/1.1"+" "+statusCode+" "+statusReason);
    }
    private void sendHeaders() throws IOException {
      Set<Entry<String,String>> entrySet=headers.entrySet();
      for(Entry<String,String> e:entrySet){
          String key =e.getKey();
          String value=e.getValue();
          println(key+":"+value);

      }
        println("");
    }
    private void sendContent() throws IOException {
        try(
        FileInputStream fis=new FileInputStream(contentFile);
        ) {
            OutputStream out = socket.getOutputStream();
            byte[] buf = new byte[1024 * 10];
            int len;
            while ((len = fis.read(buf)) != -1) {
                out.write(buf, 0, len);
            }
        }
    }
    private void println(String line) throws IOException {
        OutputStream out=socket.getOutputStream();
        byte[]data = line.getBytes(StandardCharsets.ISO_8859_1);

        out.write(data);
        out.write(13);
        out.write(10);
    }

    public int getStatusCode() {
        return statusCode;
    }

    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }

    public String getStatusReason() {
        return statusReason;
    }

    public void setStatusReason(String statusReason) {
        this.statusReason = statusReason;
    }

    public File getContentFile() {
        return contentFile;
    }

    public void setContentFile(File contentFile) {

        try {
            this.contentFile = contentFile;

            String type = Files.probeContentType(contentFile.toPath());
            if(type!=null){
                addHeader("Content-Type",type);
            }
        } catch (IOException e) {
        }
        addHeader("Content-Length",contentFile.length()+"");


    }


    public void addHeader(String name,String value){
        headers.put(name,value);
    }
}
